package com.william.jdbcplus.boot.starter.service;

import com.william.jdbcplus.common.entity.Entity;
import com.william.jdbcplus.common.page.IPage;
import com.william.jdbcplus.core.query.EntityWrap;
import com.william.jdbcplus.core.query.UpdateWrap;

import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface IService {

    /**
     * 新增实体
     *
     * @param entity
     * @param <M>
     * @return
     */
    <M extends Entity> String add(M entity);

    /**
     * 新增或者修改
     * <p>实体主键为空时新增，实体主键非空先查找是否存在，存在则更新非空值，不存在则新增</p>
     *
     * @param entity
     * @param <M>
     * @return
     */
    <M extends Entity> boolean addOrUpdate(M entity);

    /**
     * 新增或者修改实体列表
     *
     * @param entityList
     * @param <M>
     * @return
     */
    <M extends Entity> boolean addOrUpdateList(Collection<M> entityList);

    /**
     * 复制实体列表
     *
     * @param entityList
     * @param <M>
     * @return
     */
    <M extends Entity> boolean copyList(List<M> entityList);

    /**
     * 新增实体列表
     *
     * @param entityList
     * @param <M>
     * @return
     */
    <M extends Entity> boolean addList(List<M> entityList);

    /**
     * 根据id和更新条件更新
     *
     * @param <M>
     * @return
     */
    <M extends Entity> boolean updateById(String id, UpdateWrap<M> updateWrap);

    /**
     * 只更新实体中非空字段， 实体主键属性值不可为空
     *
     * @param entity
     * @param <M>
     * @return
     */
    <M extends Entity> boolean updateById(M entity);

    /**
     * 按条件更新实体中非空字段
     *
     * @param entity
     * @param wrap
     * @param <M>
     * @return
     */
    <M extends Entity> boolean update(M entity, EntityWrap<M> wrap);

    /**
     * 按条件更新实体中指定字段
     *
     * @param updateWrap 指定的字段
     * @param entityWrap 条件
     * @param <M>
     * @return
     */
    <M extends Entity> boolean update(UpdateWrap<M> updateWrap, EntityWrap<M> entityWrap);

    /**
     * 更新字段
     *
     * @param columnMap
     * @param wrap
     * @param <M>
     * @return
     */
    <M extends Entity> boolean updateByMap(Map<String, Object> columnMap, EntityWrap<M> wrap);

    /**
     * 更新实体列表
     *
     * @param entityList
     * @param <M>
     * @return
     */
    <M extends Entity> boolean updateList(Collection<M> entityList);

    /**
     * 更新实体中所有字段， 实体主键属性值不可为空
     *
     * @param entity
     * @param <M>
     * @return
     */
    <M extends Entity> boolean updateAll(M entity);

    /**
     * 根据id删除实体
     *
     * @param id
     * @param entityClass
     * @param <M>
     * @return
     */
    <M extends Entity> boolean deleteById(String id, Class<M> entityClass);

    /**
     * 根据id列表删除实体
     *
     * @param ids
     * @param entityClass
     * @param <M>
     * @return
     */
    <M extends Entity> boolean deleteByIds(Collection<String> ids, Class<M> entityClass);

    /**
     * 根据条件删除实体
     *
     * @param wrap
     * @param <M>
     * @return
     */
    <M extends Entity> boolean delete(EntityWrap<M> wrap);

    /**
     * 删除全部实体
     *
     * @param entityClass
     * @param <M>
     * @return
     */
    <M extends Entity> boolean deleteAll(Class<M> entityClass);

    /**
     * 根据id物理删除实体
     *
     * @param id
     * @param entityClass
     * @param <M>
     * @return
     */
    <M extends Entity> boolean realDelById(String id, Class<M> entityClass);

    /**
     * 根据id列表物理删除实体
     *
     * @param ids
     * @param entityClass
     * @param <M>
     * @return
     */
    <M extends Entity> boolean realDelByIds(Collection<String> ids, Class<M> entityClass);

    /**
     * 根据条件物理删除实体
     *
     * @param wrap
     * @param <M>
     * @return
     */
    <M extends Entity> boolean realDel(EntityWrap<M> wrap);

    /**
     * 物理删除全部实体
     *
     * @param entityClass
     * @param <M>
     * @return
     */
    <M extends Entity> boolean realDelAll(Class<M> entityClass);

    /**
     * 获取一个实体
     *
     * @param id
     * @param entityClass
     * @param <M>
     * @return
     */
    <M extends Entity> M getById(String id, Class<M> entityClass);

    /**
     * 根据条件获取一个实体
     *
     * @param wrap
     * @param <M>
     * @return
     */
    <M extends Entity> M get(EntityWrap<M> wrap);

    /**
     * 查询id对应的实体是否存在
     *
     * @param id
     * @param entityClass
     * @param <M>
     * @return
     */
    <M extends Entity> boolean exists(String id, Class<M> entityClass);

    /**
     * 根据条件查询实体是否存在
     *
     * @param wrap
     * @param <M>
     * @return
     */
    <M extends Entity> boolean exists(EntityWrap<M> wrap);

    /**
     * 查询实体总数
     *
     * @param entityClass
     * @param <M>
     * @return
     */
    <M extends Entity> int countAll(Class<M> entityClass);

    /**
     * 根据条件查询实体数量
     *
     * @param wrap
     * @param <M>
     * @return
     */
    <M extends Entity> int count(EntityWrap<M> wrap);

    /**
     * 查询全部实体列表
     *
     * @param entityClass
     * @param <M>
     * @return
     */
    <M extends Entity> List<M> listAll(Class<M> entityClass);

    /**
     * 根据条件查询实体列表
     *
     * @param wrap
     * @param <M>
     * @return
     */
    <M extends Entity> List<M> list(EntityWrap<M> wrap);

    /**
     * 根据id列表查询实体列表
     *
     * @param idList
     * @param entityClass
     * @param <M>
     * @return
     */
    <M extends Entity> List<M> listByIds(Collection<?> idList, Class<M> entityClass);

    /**
     * 查询分页参数和条件查询实体分页
     *
     * @param page
     * @param wrap
     * @param <M>
     * @return
     */
    <M extends Entity> IPage<M> page(IPage<?> page, EntityWrap<M> wrap);
}
